'''
#? 创建一个变量
num = 20
#? 创建一个函数
def func1():
    print("1111~~~")
def func2():
    print("2222~~~")
def func3():
    print("3333~~~")

if __name__ == "__main__":
    func1()
    func2()
    func3()
    print(3)

'''
'''
1.有一个银行账户类 Account, 包括名字 , 余额等属性，方法有存钱、取钱、查询余额的操作。要求：

		1.在存钱时，注意存款数据的格式

		2.取钱时，要判断余额是否充足，余额不够的时候要提示余额不足

'''
class Account():
    #? 账户初始金额初始金额
    account = 1000
    __slots__ = ("name",)
    def __init__(self,name) -> None:
        self.name = name
    #? 存钱
    def save_money(self,money):
        Account.account+=money
        print(f"本次存入￥{money},当前余额为￥{Account.account}")

    #? 取钱
    def draw_money(self,money):
        if money > Account.account:
            print("账户余额不足！！")
        else:
            Account -= money
            print(f"本次取出￥{money},当前余额为￥{Account.account}")

    #? 查询余额
    def query_balance(self):
        print(f"当前余额为￥{Account.account}")
#? 
if __name__ == "__main__":
    print(f"欢迎进入xxx银行系统".center(40,"*"))
    user_name = input("请输入你的账户名:")
    acc_ount = Account(user_name)
    while True:
        try:
            print('''
                1> 存钱请按 S
                2> 取钱请按 D
                3> 查询余额请按 Q
                4> 退出请按 T
            ''')
            key = input("请根据功能按下对应键: ")
            if key == "S":
                money = int(input("要存入的金额: "))
                if money % 100 !=0:
                    print("存入的金额必须是100整数倍,请正确放置")
                else:
                    acc_ount.save_money(money)
            elif key == "D":
                money = int(input("要取出的金额"))
                if money % 100 !=0:
                    print("取出的金额必须是100整数倍,请正确输入~")
                else:
                    acc_ount.save_money(money)    
            elif key =="Q":
                acc_ount.query_balance() 
            elif key =="T":
                print("感谢您使用XXX银行系统~")
                break   
            else:
                print("根据功能按下正确的键~")       
        except:
            break

'''
2.家具类(HouseItem) 有 名字 和 占地面积属性，其中

- 席梦思(bed) 占地 4 平米
- 衣柜(chest) 占地 2 平米
- 餐桌(table) 占地 1.5 平米

房子类(House) 有 户型、总面积 、剩余面积 和 家具名称列表 属性

- 新房子没有任何的家具
- 将 家具的名称 追加到 家具名称列表 中
- 判断 家具的面积 是否 超过剩余面积，如果超过，提示不能添加这件家具

a.将以上三件 家具对象 添加 到 房子对象 中

b.打印房子时，要求输出：户型、总面积、剩余面积、家具名称列表

使用面向对象思想，编码完成上述功能。

'''
class HouseItem(object):
    __slots__ = ("name","area")
    def __init__(self,name,area) -> None:
        self.name = name
        self.area = area
    def __str__(self) -> str:
        return f"家具名称：{self.name},面积:{self.area}"
    __repr__ = __str__

class House(object):
    __slots__ = ("model","total_area","free_area","houseitem_list")
    def __init__(self,model,total_area=0,free_area=0) -> None:
        self.model = model
        self.total_area = total_area
        self.free_area = free_area
        self.houseitem_list = []

    #? 置办家具
    def add_furniture(self,furn):
        if self.free_area > furn.area:
            self.houseitem_list.append(furn)
            self.free_area -= furn.area
        else:
            print(f"剩余面积不足，无法添加")
    
    def __str__(self):
        return f"户型:{self.model}、总面积:{self.total_area},家具名称列表:{self.houseitem_list}"
    __repr__ = __str__

if __name__ =="__main__":
    #? 家具
    furn_1 = HouseItem("席梦思",20)
    furn_2 = HouseItem("衣柜", 10)
    furn_3 = HouseItem("沙发", 30)

    #? 创建房子对象
    my_house = House("三室一厅一厨一卫",300,250)
    my_house.add_furniture(furn_1)
    my_house.add_furniture(furn_2)
    my_house.add_furniture(furn_3)

    #? 展示房子
    print(furn_1)
    print(my_house)

''''
学生类Student: 
	属性:学号，姓名，年龄，性别，成绩
班级类 Grade:
 	属性:班级名称，班级中的学生 【使用列表存储学生】 
	方法:
		1.查看该班级中的所有学生的信息 

		2.查看指定学号的学生信息 

		3.查看班级中成绩不及格的学生信息 

		4.将班级中的学生按照成绩降序排序

'''
class Student(object):
    __slots__ = ("id","name","age","sex","score")
    def __init__(self,id,name,age,sex,score) -> None:
        self.id = id
        self.name = name
        self.age = age
        self.sex = sex
        self.score = score

    def __str__(self) -> str:
        return f'''
    学号: {self.id} 姓名: {self.name} 年龄: {self.age} 性别: {self.sex}成绩: {self.score}
        '''
    __repr__ = __str__

class Grade(object):
    __slots__ = ("class_name","class_stu")
    def __init__(self,class_name,class_stu) -> None:
        self.class_name = class_name
        self.class_stu = class_stu

    #?指定id 学生信息
    def show_id(self,stu_id):
        for ele in self.class_stu:
            if ele.id == stu_id:
                return f'''
    学号{ele.id} 的学生信息如下：
    学号: {ele.id} 姓名: {ele.name} 年龄: {ele.age} 性别: {ele.sex} 成绩: {ele.score}
        '''
            else:
                return f"班级没有学号为{stu_id}的学生~"
    #? 查看班级中成绩不及格的学生信息
    def show_fail(self):
        for ele in self.class_stu:
            if ele.score < 60:
                return f'''
    成绩不及格的学生信息如下：
    学号: {ele.id} 姓名: {ele.name} 年龄: {ele.age} 性别: {ele.sex} 成绩: {ele.score}
        '''

    #? 成绩排序
    def score_sort(self):
        self.class_stu.sort(key=lambda stu:stu.score,reverse=True)
        return self.class_stu

    #? 展示学员信息
    def __str__(self) -> str:
        return f'''班级信息表
        {self.class_stu}
        '''
    __repr__ = __str__

s1 = Student("1001","aaa",18,"female",60)
s2 = Student("1003","bbb",18,"female",39)
s3 = Student("1002","fag",18,"female",100)
s4 = Student("1004","fag",18,"female",88)

grade =  Grade("三年二班",[s1,s2,s3,s4])
#? 查看学员信息
print(grade)
print(grade.show_id("1001"))
print(grade.show_fail())
print(grade.score_sort())


